home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
toolmanager
/
source
/
prefs
/
execwindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-15
|
34KB
|
1,150 lines
/*
* execwindow.c V2.1
*
* exec edit window handling
*
* (c) 1990-1993 Stefan Becker
*/
#include "ToolManagerConf.h"
/* Exec node */
struct ExecNode {
struct Node en_Node;
ULONG en_Flags;
UWORD en_ExecType;
WORD en_Priority;
LONG en_Delay;
ULONG en_Stack;
char *en_Command;
char *en_CurrentDir;
char *en_HotKey;
char *en_Output;
char *en_Path;
char *en_PubScreen;
};
/* Window data */
static struct Gadget *gl; /* Gadget list */
static struct Window *w; /* Window */
static void *aw; /* AppWindow pointer */
static UWORD ww,wh; /* Window size */
static struct ExecNode *CurrentNode;
static ULONG CurrentGadgetNum;
static BOOL ReqOpen;
static struct Requester DummyReq;
#define WINDOW_IDCMP (IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|\
CHECKBOXIDCMP|CYCLEIDCMP|INTEGERIDCMP|STRINGIDCMP|\
IDCMP_VANILLAKEY)
/* Gadget data */
#define GAD_NAME_STR 0 /* Gadgets with labels (left side) */
#define GAD_EXECTYPE 1
#define GAD_COMMAND_BUT 2
#define GAD_COMMAND_TXT 3
#define GAD_COMMAND_STR 4
#define GAD_HOTKEY_STR 5
#define GAD_STACK_INT 6
#define GAD_PRIORITY_INT 7
#define GAD_DELAY_INT 8
#define GAD_CURDIR_BUT 9 /* Gadgets with labels (right side) */
#define GAD_PATH_BUT 10
#define GAD_OUTPUT_BUT 11
#define GAD_PSCREEN_BUT 12
#define GAD_CURDIR_TXT 13
#define GAD_PATH_TXT 14
#define GAD_OUTPUT_TXT 15
#define GAD_PSCREEN_TXT 16
#define GAD_ARGS 17 /* Checkbox gadgets (right side) */
#define GAD_TOFRONT 18
#define GAD_CURDIR_STR 19
#define GAD_PATH_STR 20
#define GAD_OUTPUT_STR 21
#define GAD_PSCREEN_STR 22
#define GAD_OK 23 /* Button gadgets */
#define GAD_CANCEL 24
#define GADGETS 25
static struct GadgetData gdata[GADGETS];
/* Gadget tags */
static struct TagItem nametags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static char *cyclelabels[]={"CLI", "WB", "ARexx", "Dock", "Hot Key", "Network",
NULL};
static struct TagItem cycletags[]={GTCY_Labels, (ULONG) cyclelabels,
GTCY_Active, 0,
TAG_DONE};
static struct TagItem commtags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem curdtags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem hotktags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem outptags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem pathtags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem pbsctags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem stacktags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem priotags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem delaytags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem argstags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem tofronttags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
/* Gadget vanilla key data */
#define KEY_NAME 0
#define KEY_TYPE 1
#define KEY_COMMAND 2
#define KEY_HOTKEY 3
#define KEY_STACK 4
#define KEY_PRIO 5
#define KEY_DELAY 6
#define KEY_CURDIR 7
#define KEY_PATH 8
#define KEY_OUTPUT 9
#define KEY_PSCREEN 10
#define KEY_ARGS 11
#define KEY_FRONT 12
#define KEY_OK 13
#define KEY_CANCEL 14
static char KeyArray[KEY_CANCEL+1];
/* Init exec edit window */
void InitExecEditWindow(UWORD left, UWORD fheight)
{
ULONG llabwidth,lgadwidth,rlabwidth,rgadwidth;
ULONG cbwidth,butwidth,minstringwidth;
ULONG strheight=fheight+2;
ULONG i,tmp,yadd;
struct GadgetData *gd;
/* Init strings */
gdata[GAD_NAME_STR].name =AppStrings[MSG_WINDOW_NAME_GAD];
gdata[GAD_EXECTYPE].name =AppStrings[MSG_EXECWIN_EXECTYPE_GAD];
gdata[GAD_COMMAND_BUT].name ="";
gdata[GAD_COMMAND_TXT].name =AppStrings[MSG_WINDOW_COMMAND_GAD];
gdata[GAD_COMMAND_STR].name ="";
gdata[GAD_HOTKEY_STR].name =AppStrings[MSG_WINDOW_HOTKEY_GAD];
gdata[GAD_STACK_INT].name =AppStrings[MSG_EXECWIN_STACK_GAD];
gdata[GAD_PRIORITY_INT].name =AppStrings[MSG_EXECWIN_PRIORITY_GAD];
gdata[GAD_DELAY_INT].name =AppStrings[MSG_EXECWIN_DELAY_GAD];
gdata[GAD_CURDIR_TXT].name =AppStrings[MSG_EXECWIN_CURRENTDIR_GAD];
gdata[GAD_PATH_TXT].name =AppStrings[MSG_EXECWIN_PATH_GAD];
gdata[GAD_OUTPUT_TXT].name =AppStrings[MSG_EXECWIN_OUTPUT_GAD];
gdata[GAD_PSCREEN_TXT].name =AppStrings[MSG_WINDOW_PUBSCREEN_GAD];
gdata[GAD_ARGS].name =AppStrings[MSG_EXECWIN_ARGUMENTS_GAD];
gdata[GAD_TOFRONT].name =AppStrings[MSG_EXECWIN_TOFRONT_GAD];
gdata[GAD_OK].name =AppStrings[MSG_WINDOW_OK_GAD];
gdata[GAD_CANCEL].name =AppStrings[MSG_WINDOW_CANCEL_GAD];
/* Calculate maximum label width (left side) */
llabwidth=0;
gd=&gdata[GAD_NAME_STR];
for (i=GAD_NAME_STR; i<=GAD_DELAY_INT; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > llabwidth)
llabwidth=tmp;
llabwidth+=INTERWIDTH;
/* Calculate maximum gadget width (left side) */
minstringwidth=TextLength(&TmpRastPort,AppStrings[MSG_EXECWIN_NEWNAME],
strlen(AppStrings[MSG_EXECWIN_NEWNAME]))
+2*INTERWIDTH;
lgadwidth=minstringwidth;
/* Calculate maximum label width (right side) */
rlabwidth=0;
gd=&gdata[GAD_CURDIR_TXT];
for (i=GAD_CURDIR_TXT; i<=GAD_PSCREEN_TXT; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > rlabwidth)
rlabwidth=tmp;
rlabwidth+=INTERWIDTH;
/* Calculate maximum gadget width (right side) */
rgadwidth=minstringwidth;
/* Calculate maximum checkbox gadget width */
cbwidth=0;
gd=&gdata[GAD_ARGS];
for (i=GAD_ARGS; i<=GAD_TOFRONT; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > cbwidth)
cbwidth=tmp;
cbwidth+=CHECKBOX_WIDTH+INTERWIDTH;
if ((rlabwidth+rgadwidth+INTERWIDTH) < cbwidth)
rgadwidth=cbwidth-rlabwidth-INTERWIDTH;
/* Calculate minimum window width */
ww=llabwidth+lgadwidth+rlabwidth+rgadwidth+4*INTERWIDTH;
/* Calculate button gadgets width */
gd=&gdata[GAD_OK];
butwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
gd++;
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > butwidth)
butwidth=tmp;
butwidth+=2*INTERWIDTH;
if ((tmp=2*(butwidth+INTERWIDTH)) > ww) ww=tmp;
/* window height */
wh=8*fheight+9*INTERHEIGHT+14;
/* Init gadgets */
gd=gdata;
yadd=strheight+INTERHEIGHT;
tmp=(ww-llabwidth-lgadwidth-rlabwidth-rgadwidth-4*INTERWIDTH)/2;
lgadwidth+=tmp; /* String gadget width (left) */
rgadwidth+=tmp; /* String gadget width (right) */
llabwidth+=left;
tmp=WindowTop+INTERHEIGHT;
/* (left side) Name string gadget */
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=nametags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* cycle gadget */
gd++;
gd->type=CYCLE_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=cycletags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Command button gadget */
gd++;
gd->name=NULL;
gd->type=GENERIC_KIND;
gd->flags=0;
gd->left=llabwidth;
gd->top=tmp;
gd->width=REQBUTTONWIDTH;
gd->height=strheight;
/* Command text gadget */
gd++;
gd->type=TEXT_KIND;
gd->flags=PLACETEXT_LEFT;
gd->left=llabwidth;
gd->top=tmp+strheight/2;
gd->width=0;
gd->height=0;
/* Command string gadget */
gd++;
gd->name=NULL;
gd->type=STRING_KIND;
gd->tags=commtags;
gd->left=llabwidth+REQBUTTONWIDTH;
gd->top=tmp;
gd->width=lgadwidth-REQBUTTONWIDTH;
gd->height=strheight;
tmp+=yadd;
/* HotKey string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=hotktags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Stack integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=stacktags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Priority integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=priotags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Delay integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=delaytags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
/* (right side) Button gadgets */
llabwidth=ww-INTERWIDTH-REQBUTTONWIDTH-rgadwidth+left;
tmp=WindowTop+INTERHEIGHT;
gd++;
for (i=GAD_CURDIR_BUT; i<=GAD_PSCREEN_BUT; i++, gd++) {
gd->type=GENERIC_KIND;
gd->flags=0;
gd->left=llabwidth;
gd->top=tmp;
gd->width=REQBUTTONWIDTH;
gd->height=strheight;
tmp+=yadd;
}
/* (right side) dummy text gadgets */
tmp=WindowTop+strheight/2+INTERHEIGHT;
for (i=GAD_CURDIR_TXT; i<=GAD_PSCREEN_TXT; i++, gd++) {
gd->type=TEXT_KIND;
gd->flags=PLACETEXT_LEFT;
gd->left=llabwidth;
gd->top=tmp;
gd->width=0;
gd->height=0;
tmp+=yadd;
}
/* Arguments checkbox gadget */
lgadwidth=rgadwidth+rlabwidth+INTERWIDTH-cbwidth;
rlabwidth=llabwidth-rlabwidth+lgadwidth/2;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=argstags;
gd->left=rlabwidth;
gd->top=++tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=fheight-INTERHEIGHT;
tmp+=yadd;
/* ToFront checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=tofronttags;
gd->left=rlabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=fheight-INTERHEIGHT;
/* Current Directory string gadget */
tmp=WindowTop+INTERHEIGHT;
llabwidth+=REQBUTTONWIDTH;
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=curdtags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=rgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Path string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=pathtags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=rgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Output string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=outptags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=rgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Public Screen string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=pbsctags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=rgadwidth;
gd->height=strheight;
/* OK button gadget */
tmp=WindowTop+7*strheight+8*INTERHEIGHT;
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Cancel button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=ww-butwidth-INTERWIDTH+left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Init vanilla key array */
KeyArray[KEY_NAME] =FindVanillaKey(gdata[GAD_NAME_STR].name);
KeyArray[KEY_TYPE] =FindVanillaKey(gdata[GAD_EXECTYPE].name);
KeyArray[KEY_COMMAND]=FindVanillaKey(gdata[GAD_COMMAND_TXT].name);
KeyArray[KEY_HOTKEY] =FindVanillaKey(gdata[GAD_HOTKEY_STR].name);
KeyArray[KEY_STACK] =FindVanillaKey(gdata[GAD_STACK_INT].name);
KeyArray[KEY_PRIO] =FindVanillaKey(gdata[GAD_PRIORITY_INT].name);
KeyArray[KEY_DELAY] =FindVanillaKey(gdata[GAD_DELAY_INT].name);
KeyArray[KEY_CURDIR] =FindVanillaKey(gdata[GAD_CURDIR_TXT].name);
KeyArray[KEY_PATH] =FindVanillaKey(gdata[GAD_PATH_TXT].name);
KeyArray[KEY_OUTPUT] =FindVanillaKey(gdata[GAD_OUTPUT_TXT].name);
KeyArray[KEY_PSCREEN]=FindVanillaKey(gdata[GAD_PSCREEN_TXT].name);
KeyArray[KEY_ARGS] =FindVanillaKey(gdata[GAD_ARGS].name);
KeyArray[KEY_FRONT] =FindVanillaKey(gdata[GAD_TOFRONT].name);
KeyArray[KEY_OK] =FindVanillaKey(gdata[GAD_OK].name);
KeyArray[KEY_CANCEL] =FindVanillaKey(gdata[GAD_CANCEL].name);
/* Init dummy requester structure */
InitRequester(&DummyReq);
}
/* Free exec node */
void FreeExecNode(struct Node *node)
{
struct ExecNode *en=(struct ExecNode *) node;
char *s;
if (s=en->en_Node.ln_Name) free(s);
if (s=en->en_Command) free(s);
if (s=en->en_CurrentDir) free(s);
if (s=en->en_Output) free(s);
if (s=en->en_Path) free(s);
if (s=en->en_HotKey) free(s);
if (s=en->en_PubScreen) free(s);
/* Free node */
FreeMem(en,sizeof(struct ExecNode));
}
/* Copy exec node */
struct Node *CopyExecNode(struct Node *node)
{
struct ExecNode *en,*orignode=(struct ExecNode *) node;
/* Alloc memory for exec node */
if (en=AllocMem(sizeof(struct ExecNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Got an old node? */
if (orignode) {
/* Yes, copy it */
if ((!orignode->en_Node.ln_Name || (en->en_Node.ln_Name=
strdup(orignode->en_Node.ln_Name))) &&
(!orignode->en_Command || (en->en_Command=
strdup(orignode->en_Command))) &&
(!orignode->en_CurrentDir || (en->en_CurrentDir=
strdup(orignode->en_CurrentDir))) &&
(!orignode->en_Output || (en->en_Output=strdup(orignode->en_Output))) &&
(!orignode->en_Path || (en->en_Path=strdup(orignode->en_Path))) &&
(!orignode->en_HotKey || (en->en_HotKey=strdup(orignode->en_HotKey))) &&
(!orignode->en_PubScreen || (en->en_PubScreen=
strdup(orignode->en_PubScreen)))) {
/* Copy flags & numbers */
en->en_ExecType=orignode->en_ExecType;
en->en_Flags=orignode->en_Flags;
en->en_Stack=orignode->en_Stack;
en->en_Priority=orignode->en_Priority;
en->en_Delay=orignode->en_Delay;
/* Return pointer to new node */
return(en);
}
} else {
/* No, set defaults */
if (en->en_Node.ln_Name=strdup(AppStrings[MSG_EXECWIN_NEWNAME])) {
en->en_Flags=EXPOF_ARGS;
en->en_Stack=4096;
/* Return pointer to new node */
return(en);
}
}
FreeExecNode((struct Node *) en);
}
/* Call failed */
return(NULL);
}
/* Create exec node from WBArg */
struct Node *CreateExecNode(char *name, struct WBArg *wa)
{
struct ExecNode *en;
/* Alloc memory for exec node */
if (en=AllocMem(sizeof(struct ExecNode),MEMF_PUBLIC|MEMF_CLEAR)) {
char *dirbuf;
/* Init node */
if ((en->en_Node.ln_Name=strdup(name)) &&
(en->en_Command=strdup(wa->wa_Name)) &&
(dirbuf=malloc(4096))) {
/* Create & copy directory name */
if (NameFromLock(wa->wa_Lock,dirbuf,4096) &&
(en->en_CurrentDir=strdup(dirbuf))) {
/* Set defaults */
en->en_ExecType=TMET_WB;
en->en_Flags=EXPOF_ARGS;
en->en_Stack=4096;
/* All OK. */
free(dirbuf);
return(en);
}
free(dirbuf);
}
FreeExecNode((struct Node *) en);
}
/* Call failed */
return(NULL);
}
/* Activate a gadget */
static void MyActivateGadget(ULONG num)
{
ActivateGadget(gdata[num].gadget,w,NULL);
}
/* Open exec edit window */
BOOL OpenExecEditWindow(struct Node *node, struct Window *parent)
{
/* Copy node */
if (CurrentNode=(struct ExecNode *) CopyExecNode(node)) {
/* Set tags */
nametags[0].ti_Data=(ULONG) CurrentNode->en_Node.ln_Name;
cycletags[1].ti_Data=CurrentNode->en_ExecType;
commtags[0].ti_Data=(ULONG) CurrentNode->en_Command;
curdtags[0].ti_Data=(ULONG) CurrentNode->en_CurrentDir;
hotktags[0].ti_Data=(ULONG) CurrentNode->en_HotKey;
outptags[0].ti_Data=(ULONG) CurrentNode->en_Output;
pathtags[0].ti_Data=(ULONG) CurrentNode->en_Path;
pbsctags[0].ti_Data=(ULONG) CurrentNode->en_PubScreen;
stacktags[0].ti_Data=CurrentNode->en_Stack;
priotags[0].ti_Data=CurrentNode->en_Priority;
delaytags[0].ti_Data=CurrentNode->en_Delay;
argstags[0].ti_Data=(CurrentNode->en_Flags & EXPOF_ARGS)!=0;
tofronttags[0].ti_Data=(CurrentNode->en_Flags & EXPOF_TOFRONT)!=0;
/* Create gadgets */
if (gl=CreateGadgetList(gdata,GADGETS)) {
/* Open window */
if (w=OpenWindowTags(NULL,WA_Left, parent->LeftEdge,
WA_Top, parent->TopEdge+WindowTop,
WA_InnerWidth, ww,
WA_InnerHeight, wh,
WA_AutoAdjust, TRUE,
WA_Title, AppStrings[MSG_EXECWIN_TITLE],
WA_PubScreen, PublicScreen,
WA_Flags, WFLG_CLOSEGADGET|WFLG_DRAGBAR|
WFLG_DEPTHGADGET|WFLG_RMBTRAP|
WFLG_ACTIVATE,
TAG_DONE)) {
/* Add as AppWindow */
aw=NULL;
if (WorkbenchBase && WBScreen)
/* This call fails if the Workbench is NOT running! */
aw=AddAppWindowA(0,0,w,AppMsgPort,NULL);
/* Init requester button gadgets */
InitReqButtonGadget(gdata[GAD_COMMAND_BUT].gadget);
InitReqButtonGadget(gdata[GAD_CURDIR_BUT].gadget);
InitReqButtonGadget(gdata[GAD_PATH_BUT].gadget);
InitReqButtonGadget(gdata[GAD_OUTPUT_BUT].gadget);
InitReqButtonGadget(gdata[GAD_PSCREEN_BUT].gadget);
/* Add gadgets to window */
AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
RefreshGList(gl,w,NULL,(UWORD) -1);
GT_RefreshWindow(w,NULL);
/* Activate first gadget */
MyActivateGadget(GAD_NAME_STR);
/* Set local variables */
w->UserPort=IDCMPPort;
w->UserData=(BYTE *) HandleExecEditWindowIDCMP;
ModifyIDCMP(w,WINDOW_IDCMP);
CurrentWindow=w;
if (aw) HandleAppMsg=HandleExecEditWindowAppMsg;
ReqOpen=FALSE;
/* Set up file requester parameters */
FileReqParms.frp_Window=w;
FileReqParms.frp_OKText=AppStrings[MSG_FILEREQ_OK_GAD];
FileReqParms.frp_Flags1=FRF_DOPATTERNS;
/* All OK. */
return(TRUE);
}
FreeGadgets(gl);
}
FreeExecNode((struct Node *) CurrentNode);
}
/* Call failed */
return(FALSE);
}
/* Close exec edit window */
static void CloseExecEditWindow(void)
{
/* Free resources */
RemoveGList(w,gl,(UWORD) -1);
if (aw) {
HandleAppMsg=HandleMainWindowAppMsg;
RemoveAppWindow(aw);
}
CloseWindowSafely(w);
FreeGadgets(gl);
}
/* Handle application messages */
void HandleExecEditWindowAppMsg(struct AppMessage *msg)
{
struct WBArg *wa;
DEBUG_PRINTF("AppMsg 0x%08lx\n",msg);
/* Get first argument */
if (wa=msg->am_ArgList) {
BPTR olddir;
struct DiskObject *dobj;
DEBUG_PRINTF("Argument 0x%08lx\n",wa);
/* Go to new current dir */
olddir=CurrentDir(wa->wa_Lock);
/* Get icon */
if (dobj=GetDiskObjectNew(wa->wa_Name)) {
char *command=NULL;
/* Get program name */
switch (dobj->do_Type) {
case WBTOOL:
case WBPROJECT: command=(char *) wa->wa_Name;
break;
default: DisplayBeep(NULL);
break;
}
/* Command string valid? */
if (command) {
char *dirbuf;
/* Allocate memory for directory buffer */
if (dirbuf=malloc(4096)) {
/* Get current dir name */
if (NameFromLock(wa->wa_Lock,dirbuf,4096)) {
/* Set new gadget values */
CurrentNode->en_ExecType=TMET_WB;
GT_SetGadgetAttrs(gdata[GAD_EXECTYPE].gadget,w,NULL,
GTCY_Active,TMET_WB,TAG_DONE);
GT_SetGadgetAttrs(gdata[GAD_NAME_STR].gadget,w,NULL,
GTST_String,wa->wa_Name,TAG_DONE);
GT_SetGadgetAttrs(gdata[GAD_COMMAND_STR].gadget,w,NULL,
GTST_String,command,TAG_DONE);
GT_SetGadgetAttrs(gdata[GAD_CURDIR_STR].gadget,w,NULL,
GTST_String,dirbuf,TAG_DONE);
/* Tool? */
if (dobj->do_Type==WBTOOL)
/* Yes, set stack */
GT_SetGadgetAttrs(gdata[GAD_STACK_INT].gadget,w,NULL,
GTIN_Number,dobj->do_StackSize,TAG_DONE);
}
free(dirbuf);
}
}
/* Free icon */
FreeDiskObject(dobj);
} else
DisplayBeep(NULL);
CurrentDir(olddir);
}
}
/* Command gadget function */
static void CommandGadgetFunc(void)
{
char *file;
struct Gadget *g=gdata[GAD_COMMAND_STR].gadget;
/* Dock exec type? */
if (CurrentNode->en_ExecType==TMET_Dock) {
/* Yes. Open list requester */
if (!ReqOpen && OpenListRequester(LISTREQ_DOCK,w)) {
/* Disable window */
DisableWindow(w,&DummyReq);
/* Save gadget number */
CurrentGadgetNum=GAD_COMMAND_STR;
/* Set update function */
UpdateWindow=UpdateExecEditWindow;
ReqOpen=TRUE;
}
} else {
/* No. Set file requester parameters */
FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_FILE];
FileReqParms.frp_Flags2=FRF_REJECTICONS;
FileReqParms.frp_OldFile=((struct StringInfo *) g->SpecialInfo)->Buffer;
/* Open file requester */
if (file=OpenFileRequester(&DummyReq)) {
/* Set new file string */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,file, TAG_DONE);
free(file);
}
}
/* Activate command string gadget */
ActivateGadget(g,w,NULL);
}
/* Current directory gadget function */
static void CurDirGadgetFunc(void)
{
char *file;
struct Gadget *g=gdata[GAD_CURDIR_STR].gadget;
/* Set file requester parameters */
FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_DRAWER];
FileReqParms.frp_Flags2=FRF_DRAWERSONLY|FRF_REJECTICONS;
FileReqParms.frp_OldFile=((struct StringInfo *) g->SpecialInfo)->Buffer;
/* Open file requester */
if (file=OpenFileRequester(&DummyReq)) {
/* Set new file string */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,file,TAG_DONE);
free(file);
}
/* Activate current directory string gadget */
ActivateGadget(g,w,NULL);
}
/* Path gadget function */
static void PathGadgetFunc(void)
{
char *file;
struct Gadget *g=gdata[GAD_PATH_STR].gadget;
/* Set file requester parameters */
FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_DRAWER];
FileReqParms.frp_Flags2=FRF_DRAWERSONLY|FRF_REJECTICONS;
FileReqParms.frp_OldFile="";
/* Open file requester */
if (file=OpenFileRequester(&DummyReq)) {
char *oldpath,*path;
ULONG len;
oldpath=((struct StringInfo *) g->SpecialInfo)->Buffer;
len=strlen(oldpath);
/* Alloc memory for new path string */
if (path=malloc(len+strlen(file)+2)) {
/* Build new path string. Got old path? */
if (len) {
/* Yes. Append new path */
strcpy(path,oldpath);
path[len]=';';
strcpy(path+len+1,file);
} else
/* No. Copy new path */
strcpy(path,file);
/* Set new path string */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,path,TAG_DONE);
free(path);
}
free(file);
}
/* Activate path string gadget */
ActivateGadget(g,w,NULL);
}
/* Output gadget function */
static void OutputGadgetFunc(void)
{
char *file;
struct Gadget *g=gdata[GAD_OUTPUT_STR].gadget;
/* Set file requester parameters */
FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_FILE];
FileReqParms.frp_Flags2=FRF_REJECTICONS;
FileReqParms.frp_OldFile=((struct StringInfo *) g->SpecialInfo)->Buffer;
/* Open file requester */
if (file=OpenFileRequester(&DummyReq)) {
/* Set new file string */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,file,TAG_DONE);
free(file);
}
/* Activate output string gadget */
ActivateGadget(g,w,NULL);
}
/* Public screen gadget function */
static void PubScreenGadgetFunc(void)
{
/* Open list requester */
if (!ReqOpen && OpenListRequester(LISTREQ_PUBSC,w)) {
/* Disable window */
DisableWindow(w,&DummyReq);
/* Save gadget number */
CurrentGadgetNum=GAD_PSCREEN_STR;
/* Set update function */
UpdateWindow=UpdateExecEditWindow;
ReqOpen=TRUE;
}
}
/* OK gadget function */
static struct Node *OKGadgetFunc(void)
{
struct Node *rc;
char *s;
/* Free old strings */
if (s=CurrentNode->en_Node.ln_Name) free(s);
CurrentNode->en_Node.ln_Name=NULL;
if (s=CurrentNode->en_Command) free(s);
CurrentNode->en_Command=NULL;
if (s=CurrentNode->en_CurrentDir) free(s);
CurrentNode->en_CurrentDir=NULL;
if (s=CurrentNode->en_Output) free(s);
CurrentNode->en_Output=NULL;
if (s=CurrentNode->en_Path) free(s);
CurrentNode->en_Path=NULL;
if (s=CurrentNode->en_HotKey) free(s);
CurrentNode->en_HotKey=NULL;
if (s=CurrentNode->en_PubScreen) free(s);
CurrentNode->en_PubScreen=NULL;
/* Duplicate new strings */
if (((CurrentNode->en_Node.ln_Name=
DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_Command=
DuplicateBuffer(gdata[GAD_COMMAND_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_CurrentDir=
DuplicateBuffer(gdata[GAD_CURDIR_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_Output=
DuplicateBuffer(gdata[GAD_OUTPUT_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_Path=
DuplicateBuffer(gdata[GAD_PATH_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_HotKey=
DuplicateBuffer(gdata[GAD_HOTKEY_STR].gadget)) != (char *) -1) &&
((CurrentNode->en_PubScreen=
DuplicateBuffer(gdata[GAD_PSCREEN_STR].gadget)) != (char *) -1)) {
/* Copy integer gadget values */
CurrentNode->en_Stack=
((struct StringInfo *) gdata[GAD_STACK_INT].gadget->SpecialInfo)->LongInt;
CurrentNode->en_Priority=
((struct StringInfo *) gdata[GAD_PRIORITY_INT].gadget->SpecialInfo)
->LongInt;
CurrentNode->en_Delay=
((struct StringInfo *) gdata[GAD_DELAY_INT].gadget->SpecialInfo)->LongInt;
rc=(struct Node *) CurrentNode;
} else {
/* Couldn't copy strings */
rc=(struct Node *) -1;
FreeExecNode((struct Node *) CurrentNode);
}
return(rc);
}
/* Handle exec edit window IDCMP events */
void *HandleExecEditWindowIDCMP(struct IntuiMessage *msg)
{
struct Node *NewNode=NULL;
/* Which IDCMP class? */
switch (msg->Class) {
case IDCMP_CLOSEWINDOW: NewNode=(struct Node *) -1;
FreeExecNode((struct Node *) CurrentNode);
break;
case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
GT_EndRefresh(w,TRUE);
break;
case IDCMP_GADGETUP:
switch (((struct Gadget *) msg->IAddress) ->GadgetID) {
case GAD_EXECTYPE: /* Save type */
CurrentNode->en_ExecType=msg->Code;
break;
case GAD_COMMAND_BUT: CommandGadgetFunc();
break;
case GAD_CURDIR_BUT: CurDirGadgetFunc();
break;
case GAD_PATH_BUT: PathGadgetFunc();
break;
case GAD_OUTPUT_BUT: OutputGadgetFunc();
break;
case GAD_PSCREEN_BUT: PubScreenGadgetFunc();
break;
case GAD_ARGS: /* Toggle flag */
CurrentNode->en_Flags^=EXPOF_ARGS;
break;
case GAD_TOFRONT: /* Toggle flag */
CurrentNode->en_Flags^=EXPOF_TOFRONT;
break;
case GAD_OK: NewNode=OKGadgetFunc();
break;
case GAD_CANCEL: NewNode=(struct Node *) -1;
FreeExecNode((struct Node *) CurrentNode);
break;
}
break;
case IDCMP_VANILLAKEY:
switch (MatchVanillaKey(msg->Code,KeyArray)) {
case KEY_NAME: MyActivateGadget(GAD_NAME_STR);
break;
case KEY_TYPE: {
/* Get next cycle gadget code */
ULONG oldtype=CurrentNode->en_ExecType;
ULONG newtype;
/* Forward or backward cycle */
if (islower(msg->Code))
newtype=(oldtype+1) % (TMET_Network+1);
else
newtype=(oldtype>0) ? oldtype-1 : TMET_Network;
/* Set cycle gadget */
GT_SetGadgetAttrs(gdata[GAD_EXECTYPE].gadget,w,NULL,
GTCY_Active, newtype,
TAG_DONE);
/* Save type */
CurrentNode->en_ExecType=newtype;
}
break;
case KEY_COMMAND: CommandGadgetFunc();
break;
case KEY_HOTKEY: MyActivateGadget(GAD_HOTKEY_STR);
break;
case KEY_STACK: MyActivateGadget(GAD_STACK_INT);
break;
case KEY_PRIO: MyActivateGadget(GAD_PRIORITY_INT);
break;
case KEY_DELAY: MyActivateGadget(GAD_DELAY_INT);
break;
case KEY_CURDIR: CurDirGadgetFunc();
break;
case KEY_PATH: PathGadgetFunc();
break;
case KEY_OUTPUT: OutputGadgetFunc();
break;
case KEY_PSCREEN: PubScreenGadgetFunc();
break;
case KEY_ARGS: /* Toggle flag */
CurrentNode->en_Flags^=EXPOF_ARGS;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_ARGS].gadget,w,NULL,
GTCB_Checked, (CurrentNode->en_Flags & EXPOF_ARGS),
TAG_DONE);
break;
case KEY_FRONT: /* Toggle flag */
CurrentNode->en_Flags^=EXPOF_TOFRONT;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_TOFRONT].gadget,w,NULL,
GTCB_Checked, (CurrentNode->en_Flags & EXPOF_TOFRONT),
TAG_DONE);
break;
case KEY_OK: NewNode=OKGadgetFunc();
break;
case KEY_CANCEL: NewNode=(struct Node *) -1;
FreeExecNode((struct Node *) CurrentNode);
break;
}
break;
}
/* Close window? */
if (NewNode) {
/* Yes. But first reply message!!! */
GT_ReplyIMsg(msg);
CloseExecEditWindow();
}
return(NewNode);
}
/* Update Exec edit window */
void UpdateExecEditWindow(void *data)
{
/* Got data? */
if (data != LREQRET_CANCEL) {
struct Gadget *g=gdata[CurrentGadgetNum].gadget;
char *new;
/* Selected something? */
new=(data == LREQRET_NOSELECT) ? NULL : ((struct Node *) data)->ln_Name;
/* Set new public screen name */
GT_SetGadgetAttrs(g,w,NULL,GTST_String,new,
TAG_DONE);
/* Activate string gadget */
ActivateGadget(g,w,NULL);
}
/* Enable window */
EnableWindow(w,&DummyReq,WINDOW_IDCMP);
/* Restore update function pointer */
UpdateWindow=UpdateMainWindow;
CurrentWindow=w;
ReqOpen=FALSE;
}
/* Read TMEX IFF chunk into Exec node */
struct Node *ReadExecNode(UBYTE *buf)
{
struct ExecNode *en;
/* Allocate memory for node */
if (en=AllocMem(sizeof(struct ExecNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct ExecPrefsObject *epo=(struct ExecPrefsObject *) buf;
ULONG sbits=epo->epo_StringBits;
UBYTE *ptr=(UBYTE *) &epo[1];
if ((!(sbits & EXPO_NAME) || (en->en_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_COMMAND) || (en->en_Command=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_CURDIR) || (en->en_CurrentDir=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_HOTKEY) || (en->en_HotKey=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_OUTPUT) || (en->en_Output=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_PATH) || (en->en_Path=GetConfigStr(&ptr))) &&
(!(sbits & EXPO_PSCREEN) || (en->en_PubScreen=GetConfigStr(&ptr)))) {
/* Copy flags & values */
en->en_Flags=epo->epo_Flags;
en->en_ExecType=epo->epo_ExecType;
en->en_Priority=epo->epo_Priority;
en->en_Delay=epo->epo_Delay;
en->en_Stack=epo->epo_Stack;
/* All OK. */
return(en);
}
/* Call failed */
FreeExecNode((struct Node *) en);
}
return(NULL);
}
/* Write Exec node to TMEX IFF chunk */
BOOL WriteExecNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct ExecNode *en=(struct ExecNode *) node;
struct ExecPrefsObject *epo=(struct ExecPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &epo[1];
/* Copy strings */
if (PutConfigStr(en->en_Node.ln_Name,&ptr)) sbits|=EXPO_NAME;
if (PutConfigStr(en->en_Command,&ptr)) sbits|=EXPO_COMMAND;
if (PutConfigStr(en->en_CurrentDir,&ptr)) sbits|=EXPO_CURDIR;
if (PutConfigStr(en->en_HotKey,&ptr)) sbits|=EXPO_HOTKEY;
if (PutConfigStr(en->en_Output,&ptr)) sbits|=EXPO_OUTPUT;
if (PutConfigStr(en->en_Path,&ptr)) sbits|=EXPO_PATH;
if (PutConfigStr(en->en_PubScreen,&ptr)) sbits|=EXPO_PSCREEN;
/* set string bits */
epo->epo_StringBits=sbits;
/* Copy flags & values */
epo->epo_Flags=en->en_Flags;
epo->epo_ExecType=en->en_ExecType;
epo->epo_Priority=en->en_Priority;
epo->epo_Delay=en->en_Delay;
epo->epo_Stack=en->en_Stack;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMEX,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}